/**
 * 
 * @param {*} state 唯一数据源
 * @param {*} action 传入的 action 行为
 */

const reducer = (state, action) => {
    let newState = null
    switch (action.type) {

        // 添加任务
        case 'add_task':
            // 深拷贝数据
            newState = JSON.parse(JSON.stringify(state))
            // 获取所有任务的 ID
            let ids = newState.todos.map(item => {
                return item.id
            })
            // 计算所有任务 ID 的最大值
            let maxId = Math.max.apply(null, ids) + 1
            // 新的任务
            let todo = {
                id: maxId,
                etitle: action.title,
                done: false
            }

            // 添加新任务
            newState.todos.push(todo)
            return newState

        // 删除任务
        case 'delete_task':
            // 删除任务
            newState = JSON.parse(JSON.stringify(state))
            // 查找要删除的数据索引
            let index = newState.todos.findIndex(item => {
                return item.id === action.id
            })
            // 根据索引删除数组的元素
            newState.todos.splice(index, 1)
            return newState

        // 单个切换
        case 'toggleA_tast':
            newState = JSON.parse(JSON.stringify(state))
            newState.todos.some(item => {
                if (item.id === action.id) {
                    // 找到后把对应done状态取反
                    item.done = !item.done
                    // 终止继续遍历
                    return true
                }
                return false
            })
            return newState

        // 全选任务
        case 'all_select_tast':
            // 控制所有的列表的选中状态
            newState = JSON.parse(JSON.stringify(state))
            newState.todos.forEach(item => {
                item.done = !action.status
            })
            return newState

        // 编辑显示输入框
        case 'handle_double_tast':
            newState = JSON.parse(JSON.stringify(state))
            newState.todos.some(item => {
                if (item.id === parseInt(action.id)) {
                    // 找到后把对应isEdit状态取反
                    item.isEdit = !item.isEdit
                    // 终止继续遍历
                    return true
                }
                return false
            })
            return newState

        // 编辑功能
        case 'edit_title_tast':
            newState = JSON.parse(JSON.stringify(state))
            newState.todos.some(item => {
                if (item.id === parseInt(action.id)) {
                    // 把最新的输入内容进行更新
                    item.etitle = action.value
                    return true
                }
                return false
            })
            return newState

        // 筛选条件切换
        case 'filter_task':
            newState = JSON.parse(JSON.stringify(state))
            newState.currentType = action.currentType
            return newState

        // 清空
        case 'clear_all':
            newState = JSON.parse(JSON.stringify(state))
            newState.todos = newState.todos.filter(item => {
                return !item.done
            })
            return newState


        default:
            return state
    }
}

export default reducer